package org.aiesec.fortaleza.xmatch.model.entity;

import java.util.Date;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Enumerated;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import org.aiesec.fortaleza.xmatch.model.enumeration.Status;
import org.aiesec.fortaleza.xmatch.model.enumeration.TipoIntercambio;
import org.hibernate.validator.Email;
import org.hibernate.validator.Length;
import org.hibernate.validator.NotNull;
import org.hibernate.validator.Pattern;

/**
 *	Representa um EP. Um EP e um candidato a intercambista no sistema. Ele
 *  pode se candidatar a apenas uma TN por vez, e e gerenciado por um Membro.
 */
@Entity(name="EP")
@Table(name="XMATCH_EP")
public class EP extends EntityBase {

	@NotNull
	@Pattern(regex="EP-[A-Za-z]{2}-[A-Za-z]{2}-[A-Za-z]{2}-[0-9]{4}-[0-9]{1,4}")
	@Column(name="EPID")
	private String epid;
	
	@NotNull
	@Column(name="NOME")
	@Length(max=30)
	private String nome;
	
	@NotNull
	@Email
	@Column(name="EMAIL")
	private String email;
	
	@Column(name="TELEFONE")
	@Length(min=7,max=13)
	private String telefone;
	
	@Enumerated
	@Column(name="TIPO_INTERCAMBIO")
	private TipoIntercambio tipoIntercambio;
	
	@Temporal(TemporalType.DATE)	
	private Date inicio;
	
	@Temporal(TemporalType.DATE)
	private Date fim;
	
	@Temporal(TemporalType.DATE)	
	private Date termino_contrato;
	
	@Enumerated
	@Column(name="STATUS")
	private Status status;
	
	@OneToOne
	@JoinColumn(name="TN_ID")
	private TN tn_match;
	
	@ManyToOne
	@JoinColumn(name="MEMBRO_ID")
	private Membro membro;
	
	@ManyToMany
	@JoinTable(name="HABILIDADES_EP",
			joinColumns={@JoinColumn(name="EP_ID")},
			inverseJoinColumns={@JoinColumn(name="HABILIDADE_ID")})
	private List<Habilidade> habilidades;
	
	@ManyToMany
	@JoinTable(name="LIGUAS_EP",
			joinColumns={@JoinColumn(name="EP_ID")},
			inverseJoinColumns={@JoinColumn(name="LINGUA_ID")})
	private List<Lingua> linguas;
	
	public EP() {
		
	}

	public String getEpid() {
		return epid;
	}

	public void setEpid(String epid) {
		this.epid = epid;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getTelefone() {
		return telefone;
	}

	public void setTelefone(String telefone) {
		this.telefone = telefone;
	}

	public Date getInicio() {
		return inicio;
	}

	public void setInicio(Date inicio) {
		this.inicio = inicio;
	}

	public Date getFim() {
		return fim;
	}

	public void setFim(Date fim) {
		this.fim = fim;
	}

	public Date getTermino_contrato() {
		return termino_contrato;
	}

	public void setTermino_contrato(Date termino_contrato) {
		this.termino_contrato = termino_contrato;
	}

	public TipoIntercambio getTipoIntercambio() {
		return tipoIntercambio;
	}
	
	public void setTipoIntercambio(TipoIntercambio tipoIntercambio) {
		this.tipoIntercambio = tipoIntercambio;
	}

	public Status getStatus() {
		return status;
	}

	public void setStatus(Status status) {
		this.status = status;
	}
	
	public TN getTn_match() {
		return tn_match;
	}
	
	public void setTn_match(TN tn_match) {
		this.tn_match = tn_match;
	}
	
	public Membro getMembro() {
		return membro;
	}
	
	public void setMembro(Membro membro) {
		this.membro = membro;
	}
	
	public List<Habilidade> getHabilidades() {
		return habilidades;
	}
	
	public void setHabilidades(List<Habilidade> habilidades) {
		this.habilidades = habilidades;
	}
	
	public List<Lingua> getLinguas() {
		return linguas;
	}
	
	public void setLinguas(List<Lingua> linguas) {
		this.linguas = linguas;
	}
	
}
